ts-nodeを使ってnode –requireする方法
吉川@広島です。
アプリケーションの可変の設定値を環境変数で管理している場合、ローカル開発時に環境変数をセットする方法は
- 端末自体に環境変数をセットする
- アプリケーションをDockerコンテナ上で動かし、その中に環境変数をセットする
- direnvを利用する
- dotenvライブラリを利用する
のような選択肢があります。個人的にはdotenvを利用するのが楽と感じており、こちらを採用することが多いです。
ただ、開発時にしか利用しないdotenvを本番ソースに含みたくないという場合があるかと思います。このような場合は、nodeコマンドの--requireオプションを利用することでスマートに実現できるようです。
プログラム内でdotenvを読み込むのをやめた話 | WEB EGG
# dotenvロードを実行してからmain.jsを実行 node --require dotenv/config main.js
例に出しているmainプログラムがJavaScriptファイルならこれで良いのですが、
- TypeScriptを採用している
- ts-nodeを使って実行する
という場合は、どのようにすると良いのか調べてみました。
環境
- Node.js v15.14.0
- typescript v4.3.2
- ts-node v10.0.0
- dotenv v10.0.0
方法1 ts-nodeの--requireオプションを使う
ドキュメントによると、ts-node自体に--requireオプションがありました。
-r, --require [path] Require a node module before execution
というわけで下記のように実行できます。
# dotenvロードを実行してからmain.tsを実行 ts-node --require dotenv/config ./main.ts
方法2 ts-node/register APIを使う
こちらはts-nodeのregister APIを呼び出してnodeコマンドで実行する方法です。
ts-nodeでTypeScriptのコードを直接実行 & デバッグ - わくわくBank
下記のような config.js
を書きます。
// ./config.js require('source-map-support').install() // デバッグ用にあると便利 require('ts-node').register() // ts-node設定 require('dotenv').config() // dotenvロード
あとは、nodeコマンドの--requireで読み込んで実行します。
node --require ./config ./main.ts
まとめ
第一選択肢は方法1となるのではないかと思います(単純に楽なので)。
より細かい設定が必要になる場合は方法2の方が適しているのかもしれません。自分はそのシチュエーションにまだ出くわしていないのですが、調べていて方法2を発見した後、方法1(ts-node自体に--requireがあること)の存在に気づいたという経緯があるので、念のため両方紹介させて頂きました。
以上、参考になれば幸いです。